#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<cstdio>
#include<signal.h>
using namespace std;


// int Sum(int start,int end)
// {
//     int sum=0;
//     for(int i = start;i<=end;i++)
//     {
//         sum/=0;//异常，core转储
//         sum+=i;
//     }
//     return sum;
// }
// int main()
// {
//     // int total = Sum(0,100);
//     // cout<<"total:"<<total<<endl;
//     pid_t id = fork();
//     if(id == 0)
//     {
//         sleep(1);
//         // child
//         Sum(0, 100);
//         exit(0);
//     }
//     // father
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     if(rid == id)//等待成功
//     {
//         printf("exit code: %d, exit sig: %d, core dump: %d\n", (status>>8)&0xFF, status&0x7F, (status>>7)&0x1);
//     }
//     return 0;
// }

void printpending(sigset_t &pending)
{
    std::cout << "curr process[" << getpid() << "]pending: ";
    for (int signo = 31; signo >= 1; signo--)
    {
    if (sigismember(&pending, signo))
    {
    std::cout << 1;
    }
    else
    {
    std::cout << 0;
    }
    }
    std::cout << "\n";
}
void handler(int signo)
{
    cout<<"2号信号抵达"<<endl;
}
int main()
{
    //sigset_t bits;//linux给用户提供的一个用户级的数据类型,禁止用户直接修改位图
    //捕捉2号信号
    signal(2,handler);//自定义捕捉
    signal(2,SIG_IGN);//忽略信号
    signal(2,SIG_DFL);//信号默认处理

    //屏蔽2号信号
    sigset_t block_set,old_set;
    sigemptyset(&block_set);
    sigemptyset(&old_set);
    sigaddset(&block_set,SIGINT);//添加2号信号

    //设置进入2号信号的block表中，完成对2好信号的屏蔽
    sigprocmask(SIG_BLOCK,&block_set,&old_set);

    int cnt=15;
    while(true)
    {
        //获取当前信号的pending信号集
        sigset_t pending;
        sigpending(&pending);

        //打印pengding信号集可以看到ctrl+c不管用，终止进程的时候2号信号有0变为1
        printpending(pending);
        cnt--;

        //解除对2号信号的屏蔽
        if(cnt==0)
        {
            cout<<"解除2号信号屏蔽"<<endl;
            sigprocmask(SIG_SETMASK,&old_set,&block_set);
        }
        sleep(1);
    }
    return 0;
}